﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Configuration;

using System.Data;
using UricaoWeb.LogicaDeNegocios.Restaurantes;
namespace UricaoWeb.Datos.ConexionBD.Restaurantes
{
    public class DatosRestaurante
    {
        SqlConnection miConexion;


        /*


        /// <summary>
        ///Metodo para iniciar la coneccion de la base de datos
        /// </summary>
        public void conectar() {

            miConexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ToString());
            miConexion.Open();

        }


        /// <summary>
        ///Metodo para desconectarme de la base de datos
        /// </summary>
        public void Desconectar(){
            miConexion.Close();
        
        }


        /// <summary>
        ///Metodo para ejecutar el query en la base de datos e indica si realmente hubo algun cambio en la misma
        /// </summary>

        public void EjecutarSql(String Query) {

            SqlCommand MiComando = new SqlCommand(Query,this.miConexion);
            //ejecutamos la consulta sql
           int FilasAfectadas = MiComando.ExecuteNonQuery();
            MiComando.CommandType = CommandType.StoredProcedure;

           if (FilasAfectadas > 0) 
             //  MessageBox.Show("Operación realizada exitosamente", "la base de datos ha sido modificada", MessageBoxButtons.OK, MessageBoxIcon.Information);
          // else
           // {
               //MessageBox.Show("No se pudo realizar la modificación de la base de datos :-(", "Error del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
           //}





        /// <summary>
        ///Metodo para insertar una mesa en la base de datos -- clausurado por usar grid en aspx
        /// </summary>

        /*public void InsertarMesa( int fkRestaurante, int capacidadMesa)
        {
            //hacemos el llamado al procedimiento de la base de datos
            SqlCommand MiComando = new SqlCommand("insertarMesa", this.miConexion);
            //ejecutamos la consulta sql y despues metemos los parametros uno a uno
           
            MiComando.CommandType = CommandType.StoredProcedure;
            MiComando.Parameters.Add("@fkRestaurante", fkRestaurante);
            MiComando.Parameters.Add("@capacidadMesa", capacidadMesa);
            MiComando.ExecuteNonQuery();
            
        } */


        /// <summary>
        ///Metodo para modificar una mesa en la base de datos -- clausurado por usar grid en aspx
        /// </summary>
        /// 
/*
        public void ModificarMesa(int IdMesa,int fkRestaurante, int capacidadMesa)
        {
            //llamo a procedimiento en la base de datos
            SqlCommand MiComando = new SqlCommand("ModificarMesa", this.miConexion);
            //ejecutamos la consulta sql y despues metemos los parametros uno a uno

            MiComando.CommandType = CommandType.StoredProcedure;
            MiComando.Parameters.Add("@IdMesa", IdMesa);
            MiComando.Parameters.Add("@fkRestaurante", fkRestaurante);
            MiComando.Parameters.Add("@capacidadMesa", capacidadMesa);
            MiComando.ExecuteNonQuery();

        }


        /// <summary>
        ///Metodo para insertar un restaurante en la base de datos 
        /// </summary>


        public void InsertarRestaurante(int fkHotel, String nombreRestaurante,String telefonoRestaurante,String tipoRestaurante,
                                         int capacidadRestaurante, DateTime aperturaRestaurante, DateTime clausuraRestaurante, Boolean activoRestaurante)
        {
            //hago llamado a la abse de datos con el procedimiento
            SqlCommand MiComando = new SqlCommand("insertarRestaurante", this.miConexion);
            //ejecutamos la consulta sql y despues metemos los parametros uno a uno

            MiComando.CommandType = CommandType.StoredProcedure;
            MiComando.Parameters.Add("@fkHotel", fkHotel);
            MiComando.Parameters.Add("@nombreRestaurante", nombreRestaurante);
            MiComando.Parameters.Add("@telefonoRestaurante", telefonoRestaurante);
            MiComando.Parameters.Add("@tipoRestaurante", tipoRestaurante);
            MiComando.Parameters.Add("@capacidadRestaurante", capacidadRestaurante);
            MiComando.Parameters.Add("@aperturaRestaurante", aperturaRestaurante);
            MiComando.Parameters.Add("@clausuraRestaurante", clausuraRestaurante);
            MiComando.Parameters.Add("@activoRestaurante", 1);
            MiComando.ExecuteNonQuery();

        }




        /// <summary>
        ///Metodo que te llena un restaurante con parametro de idRestaurante
        /// </summary>

        public Restaurante restaurantePorId(int idRestaurante) 
        {
            Restaurante rest = new Restaurante(1);
            miConexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ToString());
            SqlCommand MiComando = new SqlCommand("dbo.MostrarRestauranteConId", miConexion);
            MiComando.CommandType = CommandType.StoredProcedure;
            //llamo al lector de lo que me devuelve la consulta de la base de datos
            SqlDataReader reader;
            MiComando.Parameters.AddWithValue("idRestaurante", idRestaurante);
            try
            {
                // abrir conexion
                miConexion.Open();
                //Ejecuto procedimiento almacenado 
                reader = MiComando.ExecuteReader();
                //Mientras haya filas en el query
                while (reader.Read())
                {
                    rest.NombreRestaurante = reader["nombreRestaurante"].ToString();
                    rest.IdRestaurante = int.Parse(reader["idRestaurante"].ToString());
                    rest.TelefonoRestaurante = (reader["telefonoRestaurante"].ToString());
                    rest.TipoRestaurante= reader["tipoRestaurante"].ToString();
                    rest.CapacidadRestaurante = int.Parse(reader["capacidadRestaurante"].ToString());
                    rest.AperturaRestaurante = (DateTime)reader["aperturaRestaurante"];
                    rest.ClausuraRestaurante = (DateTime)reader["clausuraRestaurante"];
                    rest.ActivoRestaurante = Boolean.Parse(reader["activoRestaurante"].ToString());

                }

            }
            catch (Exception e)
            {
                return null;
            }
            finally
            {

                miConexion.Close();
            }
            return rest;
        }





        /// <summary>
        ///Metodo para modificar un restaurante en la base de datos, incluye desactivar el restaurante
        /// </summary>


        public void ModificarRestaurante(int id, int fkHotel, String nombreRestaurante, String telefonoRestaurante, String tipoRestaurante,
                                        int capacidadRestaurante, DateTime aperturaRestaurante, DateTime clausuraRestaurante,Boolean activoRestaurante)
        {

            SqlCommand MiComando = new SqlCommand("ModificarRestaurante", this.miConexion);
            //ejecutamos la consulta sql y despues metemos los parametros uno a uno

            MiComando.CommandType = CommandType.StoredProcedure;
            MiComando.Parameters.Add("@id", id);
            MiComando.Parameters.Add("@fkHotel", fkHotel);
            MiComando.Parameters.Add("@nombreRestaurante", nombreRestaurante);
            MiComando.Parameters.Add("@telefonoRestaurante", telefonoRestaurante);
            MiComando.Parameters.Add("@tipoRestaurante", tipoRestaurante);
            MiComando.Parameters.Add("@capacidadRestaurante", capacidadRestaurante);
            MiComando.Parameters.Add("@aperturaRestaurante", aperturaRestaurante);
            MiComando.Parameters.Add("@clausuraRestaurante", clausuraRestaurante);
            // cambiar activo restaurante por swicth
            MiComando.Parameters.Add("@activoRestaurante", 1);
            MiComando.ExecuteNonQuery();

        }



        /// <summary>
        //Metodo que valida que un restaurante no se llame igual a otro creado, usa Upper case
        /// </summary>
        public Boolean restauranteMismoNombre(String nombreRestaurante)
        {
            
            miConexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ToString());
            SqlCommand MiComando = new SqlCommand("dbo.restauranteMismoNombre", miConexion);
            MiComando.CommandType = CommandType.StoredProcedure;
            MiComando.Parameters.AddWithValue("nombreRestaurante", nombreRestaurante);
            MiComando.Parameters.Add("AlreadyExists", SqlDbType.Int).Direction = ParameterDirection.Output;
            Boolean mismoNombre = false;
          
                // abrir conexion
                miConexion.Open();
                MiComando.ExecuteNonQuery();
                mismoNombre = Convert.ToBoolean(MiComando.Parameters["AlreadyExists"].Value);
                miConexion.Close();
          
            return mismoNombre;

        }



        /// <summary>

        //Valido la capacidad del restaurante comparando a las mesas del mismo

        /// </summary>
        public Boolean restauranteValidarCapacidad(int idRestaurante, int capacidadMesa)
        {

            miConexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ToString());
            SqlCommand MiComando = new SqlCommand("dbo.restauranteValidarCapacidad", miConexion);
            MiComando.CommandType = CommandType.StoredProcedure;
            MiComando.Parameters.AddWithValue("idRestaurante", idRestaurante);
            MiComando.Parameters.AddWithValue("capacidadMesa", capacidadMesa);
            MiComando.Parameters.Add("restauranteLleno", SqlDbType.Int).Direction = ParameterDirection.Output;
            Boolean lleno = false;

            // abrir conexion
            miConexion.Open();
            MiComando.ExecuteNonQuery();
            lleno = Convert.ToBoolean(MiComando.Parameters["restauranteLleno"].Value);
            miConexion.Close();

            return lleno;

        }







        /// <summary>
        //Metodo que dado un nombre de restaurante, este te devuelva el id del mismo

        /// </summary>
        public int DarIdRestaurante(String nombreRestaurante) 
        
        {

            miConexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ToString());
            SqlCommand MiComando = new SqlCommand("dbo.DarIdRestaurante", miConexion);
            MiComando.CommandType = CommandType.StoredProcedure;
            SqlDataReader reader;
            MiComando.Parameters.AddWithValue("nombreRestaurante", nombreRestaurante);

            int idRestaurante =-1;
            try
            {
                // abrir conexion
                miConexion.Open();
                //Ejecuto procedimiento almacenado
                reader = MiComando.ExecuteReader();
                //Mientras haya filas en el query
                while (reader.Read())
                {
                  
                     idRestaurante = int.Parse(reader["idRestaurante"].ToString());
                    
                }

            }
            catch (Exception e)
            {
                return -1;
            }
            finally
            {

                miConexion.Close();
            }
            return idRestaurante;


        }

        /// <summary>
        //Metodo que muestra una lista de todos los restaurantes dado un hotel en especifico
        /// </summary>

        public List<Restaurante> ListaRestaurantes(Int32 fkHotel)
        {
            List<Restaurante> listaRestaurante = new List<Restaurante>();
          miConexion = new SqlConnection(ConfigurationManager.ConnectionStrings["UricaoBD"].ToString());
             SqlCommand MiComando = new SqlCommand("dbo.MostrarRestaurantesEnHotel", miConexion);
            MiComando.CommandType = CommandType.StoredProcedure;
            SqlDataReader reader;
            MiComando.Parameters.AddWithValue("fkHotel", 1);
            try
            {
                // abrir conexion
                miConexion.Open();
                //Ejecuto procedimiento almacenado
                reader = MiComando.ExecuteReader();
               //Mientras haya filas en el query
                while (reader.Read())
                {
                    String nombreRestaurante = reader["nombreRestaurante"].ToString();
                    int idRestaurante = int.Parse(reader["idRestaurante"].ToString());
                    String telefonoRestaurante = (reader["telefonoRestaurante"].ToString());
                    String tipoRestaurante = reader["nombreRestaurante"].ToString();
                    int capacidadRestaurante = int.Parse(reader["capacidadRestaurante"].ToString());
                    DateTime aperturaRestaurante = (DateTime) reader["aperturaRestaurante"];
                    DateTime clausuraRestaurante = (DateTime) reader["clausuraRestaurante"];
                    Boolean activoRestaurante = Boolean.Parse(reader["activoRestaurante"].ToString());

                    // Genero la lista con los atributos traidos de la base de datos
                    listaRestaurante.Add(new Restaurante(idRestaurante,fkHotel,nombreRestaurante,telefonoRestaurante,
                     tipoRestaurante, capacidadRestaurante, aperturaRestaurante, clausuraRestaurante, activoRestaurante));
                 }
                
            }
            catch (Exception e)
            {
                return null;
            }
            finally
            {
               
                miConexion.Close();
            }
            return listaRestaurante;
        }


        */



      } 

    }